package com.stefanini.pe.bbva.bp.in.bo.impl;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.pe.bbva.utils.Constantes;
import com.stefanini.pe.bbva.bp.in.bo.iface.PerfilamientoBOIface;
import com.stefanini.pe.bbva.bp.in.dao.iface.PerfilamientoDAOIface;
import com.stefanini.pe.bbva.bp.in.to.BackTest;
import com.stefanini.pe.bbva.bp.in.to.Perfilamiento;
import com.stefanini.pe.bbva.bp.in.utils.Util;
import com.thoughtworks.xstream.XStream;

@Service("perfilamientoBO")
public class PerfilamientoBOImpl implements PerfilamientoBOIface{
	
	private static final XStream XSTREAM = new XStream();
	
	@Autowired
	private PerfilamientoDAOIface perfilamientoDAOIface;

	public List<Perfilamiento> listarHistoricoPerfilamiento(Perfilamiento oPerfilamiento) throws Exception{
		List<Perfilamiento> historicos = new ArrayList<Perfilamiento>();
		List<Perfilamiento> historicosTemp = perfilamientoDAOIface.consultarPerfilamiento(oPerfilamiento);
		for (Iterator<Perfilamiento> iter = historicosTemp.iterator(); iter.hasNext();) {
			Perfilamiento element = iter.next();
			element.setFechaperfila(Util.formatDate(element.getFechaperfila()));
			element.setSaldoactualperf(Util.formatDouble(Util.isNumber(element.getSaldoactualperf())));
			element.setSaldodisponibleperf(Util.formatDouble(Util.isNumber(element.getSaldodisponibleperf())));
			element.setSaldoretenidoperf(Util.formatDouble(Util.isNumber(element.getSaldoretenidoperf())));
			element.setUtilidad(Util.formatDouble(Util.isNumber(element.getUtilidad())));
			historicos.add(element);			
		}
		return historicos;
	}
	
	public List<Perfilamiento> consultarHistoricoPerfilamientoNoCliente(Perfilamiento perfilamiento) throws Exception{
		List<Perfilamiento> listaHistPerfilNoCliente =perfilamientoDAOIface.consultarHistoricoPerfilamientoNoCliente(perfilamiento);
		if(listaHistPerfilNoCliente!=null && listaHistPerfilNoCliente.size()>0){
			for (Iterator iter = listaHistPerfilNoCliente.iterator(); iter.hasNext();) {
				Perfilamiento element = (Perfilamiento) iter.next();
				String fechaPerfila = element.getFechaperfila();
				element.setFechaperfila(Util.formatoFecha(fechaPerfila));
			}
		}
		return listaHistPerfilNoCliente;
	}
	
	public List<HashMap> cambiarEstadoPerfilamiento(String codCliente, String idRebalanceo, String estado, String idUsuarioAsesor, String codRegistro) throws Exception{
		return perfilamientoDAOIface.cambiarEstadoPerfilamiento(codCliente, idRebalanceo, estado, idUsuarioAsesor, codRegistro);
	}
	
	public List<HashMap> cambiarEstadoPerfilamientoNoCliente(String codNoCliente, String idPerfilamiento, String estado) throws Exception{
		return perfilamientoDAOIface.cambiarEstadoPerfilamientoNoCliente(codNoCliente, idPerfilamiento, estado);
	}

	public HashMap listarArchivosPerfilamiento(Perfilamiento perfilamiento) throws Exception{
		return perfilamientoDAOIface.listarArchivosPerfilamiento(perfilamiento);
	}
	
	public HashMap listarArchivosPerfilamientoNoCliente(Perfilamiento perfilamiento) throws Exception{
		return perfilamientoDAOIface.listarArchivosPerfilamientoNoCliente(perfilamiento);
	}

	public HashMap validarPerfilamiento(String codCliente, String codRegistro) throws Exception{
		return perfilamientoDAOIface.validarPerfilamiento(codCliente, codRegistro);
	}
	
	public HashMap validarPerfilamientoNoCliente(String codNoCliente) throws Exception{
		return perfilamientoDAOIface.validarPerfilamientoNoCliente(codNoCliente);
	}

	public void listarPerfilBackTest(List listaSoles, List listaDolares, List listaEuros,
			List listaSolesRPT, List listaDolaresRPT, List listaEurosRPT) throws Exception{
		List listaBackTest = perfilamientoDAOIface.listarPerfilBackTest();
		for (Iterator iter = listaBackTest.iterator(); iter.hasNext();) {
			BackTest element = (BackTest) iter.next();
			if(element.getIdMoneda().equals(Constantes.CONSTANTE_TIPO_MONEDA_PEN)){
				listaSoles.add(element);
				listaSolesRPT.add((BackTest)XSTREAM.fromXML(XSTREAM.toXML(element)));
			}else if(element.getIdMoneda().equals(Constantes.CONSTANTE_TIPO_MONEDA_USD)){
				listaDolares.add(element);
				listaDolaresRPT.add((BackTest)XSTREAM.fromXML(XSTREAM.toXML(element)));
			}else if(element.getIdMoneda().equals(Constantes.CONSTANTE_TIPO_MONEDA_EUR)){
				listaEuros.add(element);
				listaEurosRPT.add((BackTest)XSTREAM.fromXML(XSTREAM.toXML(element)));
			}
		}
	}
	
	public void grabarPerfilBackTest(List listaSoles, List listaDolares, List listaEuros, String codUsuario) throws Exception{
		
		StringBuilder strMonedas = new StringBuilder();
		StringBuilder strIdPerfil = new StringBuilder();
		StringBuilder strRertornoProAnual = new StringBuilder();
		StringBuilder strRetornoUltimoMes = new StringBuilder();
		StringBuilder strRetornoMejorAnio = new StringBuilder();
		StringBuilder strRetornoPeorAnio = new StringBuilder();
		StringBuilder strVolatilidadProAnio = new StringBuilder();
		StringBuilder strPeorCaida = new StringBuilder();
		
		for (Iterator iter = listaSoles.iterator(); iter.hasNext();) {
			BackTest element = (BackTest) iter.next();
			strMonedas.append("PEN").append(Constantes.CONSTANTE_SEPARADOR_COMA);
			strIdPerfil.append(Util.isString(element.getIdPerfil())).append(Constantes.CONSTANTE_SEPARADOR_COMA);
			strRertornoProAnual.append(Util.isString(Util.isNumber(element.getRetornoProAnual()))).append(Constantes.CONSTANTE_SEPARADOR_COMA);
			strRetornoUltimoMes.append(Util.isString(Util.isNumber(element.getRetornoUltMeses()))).append(Constantes.CONSTANTE_SEPARADOR_COMA);
			strRetornoMejorAnio.append(Util.isString(Util.isNumber(element.getRetornoMejorAnio()))).append(Constantes.CONSTANTE_SEPARADOR_COMA);
			strRetornoPeorAnio.append(Util.isString(Util.isNumber(element.getRetornoPeorAnio()))).append(Constantes.CONSTANTE_SEPARADOR_COMA);
			strVolatilidadProAnio.append(Util.isString(Util.isNumber(element.getVolatilidadProAnio()))).append(Constantes.CONSTANTE_SEPARADOR_COMA);
			strPeorCaida.append(Util.isString(Util.isNumber(element.getPeorCaida()))).append(Constantes.CONSTANTE_SEPARADOR_COMA);
		}
		for (Iterator iter = listaDolares.iterator(); iter.hasNext();) {
			BackTest element = (BackTest) iter.next();
			strMonedas.append("USD").append(Constantes.CONSTANTE_SEPARADOR_COMA);
			strIdPerfil.append(Util.isString(element.getIdPerfil())).append(Constantes.CONSTANTE_SEPARADOR_COMA);
			strRertornoProAnual.append(Util.isString(Util.isNumber(element.getRetornoProAnual()))).append(Constantes.CONSTANTE_SEPARADOR_COMA);
			strRetornoUltimoMes.append(Util.isString(Util.isNumber(element.getRetornoUltMeses()))).append(Constantes.CONSTANTE_SEPARADOR_COMA);
			strRetornoMejorAnio.append(Util.isString(Util.isNumber(element.getRetornoMejorAnio()))).append(Constantes.CONSTANTE_SEPARADOR_COMA);
			strRetornoPeorAnio.append(Util.isString(Util.isNumber(element.getRetornoPeorAnio()))).append(Constantes.CONSTANTE_SEPARADOR_COMA);
			strVolatilidadProAnio.append(Util.isString(Util.isNumber(element.getVolatilidadProAnio()))).append(Constantes.CONSTANTE_SEPARADOR_COMA);
			strPeorCaida.append(Util.isString(Util.isNumber(element.getPeorCaida()))).append(Constantes.CONSTANTE_SEPARADOR_COMA);
		}
		for (Iterator iter = listaEuros.iterator(); iter.hasNext();) {
			BackTest element = (BackTest) iter.next();
			strMonedas.append("EUR").append(Constantes.CONSTANTE_SEPARADOR_COMA);
			strIdPerfil.append(Util.isString(element.getIdPerfil())).append(Constantes.CONSTANTE_SEPARADOR_COMA);
			strRertornoProAnual.append(Util.isString(Util.isNumber(element.getRetornoProAnual()))).append(Constantes.CONSTANTE_SEPARADOR_COMA);
			strRetornoUltimoMes.append(Util.isString(Util.isNumber(element.getRetornoUltMeses()))).append(Constantes.CONSTANTE_SEPARADOR_COMA);
			strRetornoMejorAnio.append(Util.isString(Util.isNumber(element.getRetornoMejorAnio()))).append(Constantes.CONSTANTE_SEPARADOR_COMA);
			strRetornoPeorAnio.append(Util.isString(Util.isNumber(element.getRetornoPeorAnio()))).append(Constantes.CONSTANTE_SEPARADOR_COMA);
			strVolatilidadProAnio.append(Util.isString(Util.isNumber(element.getVolatilidadProAnio()))).append(Constantes.CONSTANTE_SEPARADOR_COMA);
			strPeorCaida.append(Util.isString(Util.isNumber(element.getPeorCaida()))).append(Constantes.CONSTANTE_SEPARADOR_COMA);
		}
		HashMap map=new HashMap();
		
		map.put("in_idperfil", Util.depuraComa(strIdPerfil));
		map.put("in_moneda", Util.depuraComa(strMonedas));
		map.put("in_retornoproanual", Util.depuraComa(strRertornoProAnual));
		map.put("in_retornoultmeses", Util.depuraComa(strRetornoUltimoMes));
		map.put("in_retornomejoranio", Util.depuraComa(strRetornoMejorAnio));
		map.put("in_retornopeoranio", Util.depuraComa(strRetornoPeorAnio));
		map.put("in_volatilidadproanio", Util.depuraComa(strVolatilidadProAnio));
		map.put("in_peorcaida", Util.depuraComa(strPeorCaida));
		map.put("in_codregcrea", codUsuario);
		map.put("in_feccrea", new SimpleDateFormat(Constantes.formatoFechaApp).format(new Date()));
		map.put("in_terminalcrea", Util.getTerminal());
		
		perfilamientoDAOIface.grabarPerfilBackTest(map);
	}
}
